package main

import (
	"fmt"
	"time"
)

func main() {
	/*
		1. func NewTimer(d Duration) *Timer
				创建一个计时器，d 时间以后触发

		3.主要就是定时器，标准库中的 Timer 让用户可以定义自己的超时逻辑，
		尤其是在对应 select 处理多个 channel 的超时、单 channel 读写的超时等情形时尤为方便

		2.Timer常见的创建方式：
			t := time.NewTimer(d)
				该计时器将在其通道上至少持续 d 之后发送当前时间
				返回的是一个 Timer 对象
			t := time.AfterFunc(d, f)
			t := time.After(d)
				在等待持续时间之后，在返回的通道上发送当前时间，相当于NewTimer(d)
				返回的是一个 chan 通道（Timer对象的channel）

			定时时间：d
			触发动作：f
			时间channel：c
	*/
	//timer := time.NewTimer(3 * time.Second)
	//fmt.Printf("%T\n", timer) //*time.Timer
	//fmt.Println(time.Now())   //2023-05-22 21:43:44.8158638 +0800 CST m=+0.000996601
	//
	////此处等待channel中的数值，会阻塞 3 秒
	//ch2 := timer.C
	//fmt.Println(<-ch2) //2023-05-22 21:43:44.8158638 +0800 CST m=+0.000996601

	//新建一个计时器
	timer2 := time.NewTimer(5 * time.Second)
	//开始goroutine，来处理触发后的事件
	go func() {
		<-timer2.C
		fmt.Println("Timer 2 结束了。。。开始。。。")
	}()

	time.Sleep(3 * time.Second)
	//在计时器到时之前，可以取消计时器
	flag := timer2.Stop() //true：取消成功；false：取消失败
	if flag {
		fmt.Println("Timer 2 停止了。。。")
	}

}
